﻿using System.Threading.Tasks;
using WeChatBotSDK.Models;

namespace WeChatBotSDK.Interfaces
{
    /// <summary>
    /// 定义与微信 API 交互的服务接口。
    /// </summary>
    public interface IQXApiService
    {
        /// <summary>
        /// 异步获取微信列表。
        /// </summary>
        /// <returns>表示异步操作的任务。</returns>
        Task<GetWeChatListResponse> GetWeChatListAsync();

        /// <summary>
        /// 异步获取登录二维码。
        /// </summary>
        /// <returns>表示异步操作的任务。</returns>
        Task<WeChatResponse<QRCodeResult>> GetLoginQRCodeAsync();

        /// <summary>
        /// 异步解密 dat 图片。
        /// </summary>
        /// <param name="datPath">.dat 文件的完整路径。</param>
        /// <param name="savePath">解密后的图片保存路径。</param>
        /// <returns>返回解密操作的结果。</returns>
        Task<WeChatResponse<object>> DecryptDatImageAsync(string datPath, string savePath);

        /// <summary>
        /// 异步检测微信状态。
        /// </summary>
        /// <param name="wxid">要使用的微信机器人的 wxid。</param>
        /// <returns>表示异步操作的任务。</returns>
        Task<WeChatResponse<CheckWeChatResult>> CheckWeChatStatusAsync(string wxid);

        /// <summary>
        /// 异步下载文件或图片。
        /// </summary>
        /// <param name="path">文件路径</param>
        /// <returns>表示异步操作的任务。</returns>
        Task<byte[]> DownloadFileOrImageAsync(string path);

        /// <summary>
        /// 发送文本消息的异步方法。
        /// </summary>
        /// <param name="robotWxid">指定使用哪个微信机器人的 wxid。</param>
        /// <param name="recipientWxid">接收消息的微信用户或群的 wxid。</param>
        /// <param name="message">要发送的消息内容。</param>
        /// <returns>返回一个表示发送任务的异步操作。</returns>
        /// <exception cref="ArgumentException">当参数无效时抛出。</exception>
        Task<WeChatResponse<object>> SendTextMessageAsync(string robotWxid, string recipientWxid, string message);

        /// <summary>
        /// 发送图片的异步方法。
        /// </summary>
        /// <param name="robotWxid">要使用的微信机器人的 wxid。</param>
        /// <param name="recipientWxid">接收方的 wxid。</param>
        /// <param name="imagePath">图片的本地路径、网络直链或 Base64 格式。Base64时，需要以 base64, 开头</param>
        /// <param name="fileName">保存文件名（当 imagePath 是网络直链时必须填写）。</param>
        /// <returns>异步任务，表示发送操作的结果。</returns>
        /// <exception cref="ArgumentException">当参数无效时抛出。</exception>
        Task<WeChatResponse<object>> SendImageAsync(string robotWxid,string recipientWxid, string imagePath, string fileName = "");

        /// <summary>
        /// 异步发送文件。
        /// </summary>
        /// <param name="robotWxid">要使用的微信机器人的 wxid。</param>
        /// <param name="recipientWxid">接收方的 wxid。</param>
        /// <param name="filePath">图片的本地路径、网络直链或 Base64 格式。Base64时，需要以 base64, 开头</param>
        /// <param name="fileName">保存文件名（当 imagePath 是网络直链时必须填写）。</param>
        /// <returns>异步任务，表示发送操作的结果。</returns>
        /// <exception cref="ArgumentException">当参数无效时抛出。</exception>
        Task<WeChatResponse<object>> SendFileAsync(string robotWxid, string recipientWxid, string filePath, string fileName = "");

        /// <summary>
        /// 异步发送动态表情。
        /// </summary>
        /// <param name="robotWxid">要使用的微信机器人的 wxid。</param>
        /// <param name="recipientWxid">接收方的 wxid。</param>
        /// <param name="path">文件本地路径或者网络直链</param>
        /// <returns>异步任务，表示发送操作的结果。</returns>
        /// <exception cref="ArgumentException">当参数无效时抛出。</exception>
        Task<WeChatResponse<object>> SendDynamicEmojiAsync(string robotWxid, string recipientWxid, string path);

        /// <summary>
        /// 异步获取个人信息。
        /// </summary>
        /// <param name="wxid">要使用的微信机器人的 wxid。</param>
        /// <returns>个人信息。</returns>
        Task<WeChatResponse<列表信息>> GetPersonalInfoAsync(string wxid);

        /// <summary>
        /// 异步获取好友列表。
        /// </summary>
        /// <param name="wxid">要使用的微信机器人的 wxid。</param>
        /// <returns>好友列表。</returns>
        Task<WeChatResponse<List<列表信息>>> GetFriendListAsync(string wxid);

        /// <summary>
        /// 异步获取群聊列表。
        /// </summary>
        /// <param name="wxid">要使用的微信机器人的 wxid。</param>
        /// <returns>群聊列表。</returns>
        Task<WeChatResponse<List<列表信息>>> GetGroupChatListAsync(string wxid);

        /// <summary>
        /// 异步获取公众号列表。
        /// </summary>
        /// <param name="wxid">要使用的微信机器人的 wxid。</param>
        /// <returns>公众号列表。</returns>
        Task<WeChatResponse<List<列表信息>>> GetPublicAccountListAsync(string wxid);

        /// <summary>
        /// 异步删除好友。
        /// </summary>
        /// <param name="robotWxid">要使用的微信机器人的 wxid。</param>
        /// <param name="recipientWxid">接收方的 wxid。</param>
        /// <returns>表示异步操作的任务。</returns>
        Task<WeChatResponse<DeleteFriendResult>> DeleteFriendAsync(string robotWxid, string recipientWxid);

        /// <summary>
        /// 修改好友备注的异步方法。
        /// </summary>
        /// <param name="robotWxid">要使用的微信机器人的 wxid。</param>
        /// <param name="friendWxid">好友的 wxid。</param>
        /// <param name="newRemark">新的备注名称。</param>
        /// <returns>异步任务，表示修改操作的结果。</returns>
        /// <exception cref="ArgumentException">当参数无效时抛出。</exception>
        Task<WeChatResponse<object>> ModifyContactRemarkAsync(string robotWxid, string friendWxid, string newRemark);

        /// <summary>
        /// 异步查询对象信息。
        /// </summary>
        /// <param name="robotWxid">要使用的微信机器人的 wxid。</param>
        /// <param name="recipientWxid">要查询的 wxid。</param>
        /// <returns>表示异步操作的任务。</returns>
        Task<WeChatResponse<列表信息>> QueryContactInfoAsync(string robotWxid, string recipientWxid);

        /// <summary>
        /// 异步查询群聊信息。
        /// </summary>
        /// <param name="robotWxid">要使用的微信机器人的 wxid。</param>
        /// <param name="recipientWxid">要查询的 wxid。</param>
        /// <returns>表示异步操作的任务。</returns>
        Task<WeChatResponse<列表信息>> QueryGroupChatInfoAsync(string robotWxid, string recipientWxid);

        /// <summary>
        /// 异步获取群成员列表。
        /// </summary>
        /// <param name="robotWxid">要使用的微信机器人的 wxid。</param>
        /// <param name="recipientWxid">要查询的 wxid。</param>
        /// <param name="getNick">是否获取群成员昵称。1=不获取昵称，2=获取群昵称（性能影响）</param>
        /// <returns>表示异步操作的任务。</returns>
        Task<WeChatResponse<List<GroupMemberResult>>> GetGroupMemberListAsync(string robotWxid, string recipientWxid,string getNick="2");

        /// <summary>
        /// 获取群成员昵称的异步方法。
        /// </summary>
        /// <param name="robotWxid">要使用的微信机器人的 wxid。</param>
        /// <param name="groupWxid">群的 wxid。</param>
        /// <param name="objWxid">要查询的群成员的 wxid。</param>
        /// <returns>异步任务，表示获取操作的结果。</returns>
        /// <exception cref="ArgumentException">当参数无效时抛出。</exception>
        Task<WeChatResponse<GroupMemberResult>> GetGroupMemberNicknameAsync(string robotWxid, string groupWxid, string objWxid);
    }
}

